#ifndef LOGGER_H_
#define LOGGER_H_
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sstream>

namespace LOG_MODE {
// Enum de tipo de log
enum Log_Values {
	ERROR, WARN, INFO
};
}
class Logger {
public:

	/* Constructor */
	Logger(const std::string& file_name, const std::string& name_process,
			bool activate);

	/* Constructor copia */
	Logger(const Logger& otro) :
			fd_(otro.fd_), file_name_(otro.file_name_), fl_(otro.fl_), name_process_(
					otro.name_process_), activate_(otro.activate_) {

	}

	/* Loguea en nivel info */
	int info(const std::string& text);
	/* Loguea en nivel warn */
	int warn(const std::string& text);
	/* Loguea en nivel error */
	int error(const std::string& text);
	/* Destructor */
	virtual ~Logger();

protected:
	/* Escribe el archivo de log */
	int write_text(LOG_MODE::Log_Values mode, const std::string& text);

private:

	/* Toma el lock */
	int take_lock();
	/* Deja el lock */
	int leave_lock();
	/* Convierte a un formato standard el text recibido con su pid */
	std::string convert_text(LOG_MODE::Log_Values mode,
			const std::string& text);
	/* Devuelve en una cadena el nombre del nivel de logueo */
	std::string get_mode_text(LOG_MODE::Log_Values mode);

private:

	int fd_; // file descriptor del archivo de log
	std::string file_name_; // Nombre de archivo del log
	struct flock fl_; // Struct para el lock
	std::string name_process_; // Nombre del proceso que usa el logger
	bool activate_; // Indica si esta o no activado el logger
};

#endif /* LOGGER_H_ */
